/*
 日期：2025-05-30
 作者：lijj
 作用：多接受者处理耗时测试[post]
 详情：
    测试个数           发送消息耗时             attach 耗时             detach 耗时
    100                0.366451 ms            0.491771 ms             0.292666 ms
    1000               4.20467 ms             20.4219 ms              23.6889 ms
    10000              40.4584 ms             1001.56 ms              1664.87 ms
    100000             331.301 ms             94117.2 ms              160398 ms
    200000             809.291 ms             394457 ms               692483 ms
 测试结果：
    1. 接受者超过 10000 时，attch 和 detach 遍历时间变长
    2. 而正常发送消息 100000 接受者只需 332 ms
    3. 对于正常项目开发来说足够使用
*/

#include <iostream>
#include <string>
#if defined(_WIN32)
#include <Windows.h>
#include <process.h>
#else
#include <unistd.h>
#endif
#include <chrono>
#include "mgnotify.h"
#include "center.hpp"

using namespace std;
using namespace chrono;

typedef std::chrono::high_resolution_clock::time_point chpt;

class carrier : public BaseMessage<carrier>
{
public:
    string name;
    // 测试耗时: 开始时间
    chpt start_time;
};

class recv1 : public BaseHandle<carrier>
{
public:
    recv1() : _id(-1) {}
    ~recv1() {}
    void setId(int id) { _id = id; }
    virtual bool handle(const carrier* msg) override;
private:
    int _id;
};


void logo()
{
    cout << endl;
    cout << endl;
    cout << "  _________ __                        \n";  
    cout << " /   _____//  |_  ____   ____   ____     \n"; 
    cout << " \\_____  \\\\   __\\/  _ \\ /    \\_/ __ \\    \n"; 
    cout << " /        \\|  | (  <_> )   |  \\  ___/    \n"; 
    cout << "/_______  /|__|  \\____/|___|  /\\___  >  \n";
    cout << "        \\/                  \\/     \\/   \n";
    cout << endl;
    cout << endl;
}

void title()
{
    cout << endl;
    cout << "  日期：2025-05-30 \n";  
    cout << "  作者：lijj \n"; 
    cout << "  作用：多接受者处理耗时测试[post] \n"; 
    cout << "  详情：单个消息发送者、多个接受者，测试分别一个消息发送对应 100、1000、10000、100000、200000 个接受者耗时情况 \n"; 
    cout << endl;
}

void enter()
{
    logo();
    title();
    while(true) {
        string in;
        cin >> in;
        cout << "enter: " << in << endl;
        if(in == "quit")
            break;
    }
}

int main()
{
#if defined(_WIN32 )
    SetConsoleOutputCP(65001); // UTF-8 
    SetConsoleCP(65001);       // 输入也设为UTF-8 
#endif 
    thread t(enter);
    list<recv1*> rs1;
    auto start = high_resolution_clock::now();
    int count = 10000;
    cout << count << "个接受者构建中，请稍后...\n";
    for(int i = 0; i < count; i++) {
        recv1 *r1 = new recv1;
        r1->setId(i);
        rs1.push_back(r1);
    }
    auto end = high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed = end - start;
    cout << "attach " << count << " 接受者耗时：" << elapsed.count() << " ms." << endl;
    carrier m1;
    m1.start_time = high_resolution_clock::now();
    m1.name = "ljj";
    m1.post();
    t.join();
    start = high_resolution_clock::now();
    while (!rs1.empty()) {
        auto t = rs1.back();
        rs1.pop_back();
        delete t;
        t = nullptr;
    }
    end = high_resolution_clock::now();
    elapsed = end - start;
    cout << "detach " << count << " 接受者耗时：" << elapsed.count() << " ms." << endl;
    
    return 0;
}

bool recv1::handle(const carrier* msg)
{
    auto end = high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed = end - msg->start_time;
    // cout << "recv1--> id: " << _id << " name: " << msg->name << ", 从开始发送消息到接受消息耗时： " << elapsed.count() << " ms." << endl;

    // 消息处理耗时
    /*auto start = high_resolution_clock::now();
#if defined(_WIN32)
    Sleep(2000);
#else
    sleep(2);
#endif
    end = high_resolution_clock::now();
    elapsed = end - start;
    cout << "carrier--> name: " << msg->name << ", 消息处理耗时： " << elapsed.count() << " ms." << endl;*/
    return true;
}